Sparsereshape
对稀疏张量进行形状重塑(Reshape)。该算子将稀疏张量的索引从输入形状转换到输出形状,不改变稀疏值本身,只更新索引。该算子不区分数据类型,只处理索引信息。
对于每个稀疏元素: - 计算其在输入形状中的线性索引:
\(\text{ori\_index} = \sum_{j=0}^{\text{input\_rank}-1} \text{in\_indices}[j] \times \text{in\_stride}[j]\)
将线性索引转换为输出形状的多维索引:
\(\text{out\_indices}[j] = \text{ori\_index} / \text{out\_stride}[j]\),然后 \(\text{ori\_index} = \text{ori\_index} \% \text{out\_stride}[j]\)
- 输入:
in_indices_ptr - 输入稀疏张量的索引数组,大小为 N * input_rank,每 input_rank 个元素表示一个非零元素的索引。
in_inshape_ptr - 输入稀疏张量的形状数组,大小为 input_rank,例如 [2, 3] 表示 2×3 的矩阵。
in_outshape_ptr - 目标输出形状数组,大小为 output_rank,例如 [3, 2] 表示要将形状转换为 3×2。
out_outshape_ptr - 输出形状数组,应该与 in_outshape_ptr 一致,大小为 output_rank。
input_rank - 输入稀疏张量的维度数。
output_rank - 输出稀疏张量的维度数。
N - 稀疏张量中非零元素的数量。
in_stride - 输入形状的步长数组(临时空间),大小为 input_rank,用于中间计算。
out_stride - 输出形状的步长数组(临时空间),大小为 output_rank,用于中间计算。
core_mask - 核掩码(仅共享存储版本需要)。
- 输出:
out_indices_ptr - 转换后的索引数组,大小为 N * output_rank,每 output_rank 个元素表示一个非零元素在输出形状中的索引。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持fp32
MT7004 支持fp32
共享存储版本:
-
void sparsereshape_s(int *in_indices_ptr, int *in_inshape_ptr, int *in_outshape_ptr, int *out_indices_ptr, int *out_outshape_ptr, int input_rank, int output_rank, int N, int *in_stride, int *out_stride, int core_mask)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <sparsereshape.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在DDR空间
7 int N = 3; // 有3个非零元素
8 int input_rank = 2; // 输入是2维
9 int output_rank = 2; // 输出也是2维
10
11 // 输入形状 [2, 3],输出形状 [3, 2]
12 int in_inshape[] = {2, 3};
13 int in_outshape[] = {3, 2};
14 int out_outshape[] = {3, 2}; // 应该和 in_outshape 一致
15
16 // 输入索引:[[0,0], [0,1], [1,2]]
17 int *in_indices_ptr = (int *)0xA0000000;
18 in_indices_ptr[0] = 0; in_indices_ptr[1] = 0; // 第一个元素在位置(0,0)
19 in_indices_ptr[2] = 0; in_indices_ptr[3] = 1; // 第二个元素在位置(0,1)
20 in_indices_ptr[4] = 1; in_indices_ptr[5] = 2; // 第三个元素在位置(1,2)
21
22 // 输出索引(待填充)
23 int *out_indices_ptr = (int *)0xB0000000;
24
25 // 临时空间:步长数组
26 int *in_stride = (int *)0xC0000000; // 大小为 input_rank
27 int *out_stride = (int *)0xC0100000; // 大小为 output_rank
28
29 int core_mask = 0xff;
30
31 sparsereshape_s(in_indices_ptr, in_inshape, in_outshape, out_indices_ptr,
32 out_outshape, input_rank, output_rank, N, in_stride,
33 out_stride, core_mask);
34
35 return 0;
36}
私有存储版本:
-
void sparsereshape_p(int *in_indices_ptr, int *in_inshape_ptr, int *in_outshape_ptr, int *out_indices_ptr, int *out_outshape_ptr, int input_rank, int output_rank, int N, int *in_stride, int *out_stride)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <sparsereshape.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在L2空间
7 int N = 3;
8 int input_rank = 2;
9 int output_rank = 2;
10
11 int in_inshape[] = {2, 3};
12 int in_outshape[] = {3, 2};
13 int out_outshape[] = {3, 2};
14
15 int *in_indices_ptr = (int *)0x10000000;
16 in_indices_ptr[0] = 0; in_indices_ptr[1] = 0;
17 in_indices_ptr[2] = 0; in_indices_ptr[3] = 1;
18 in_indices_ptr[4] = 1; in_indices_ptr[5] = 2;
19
20 int *out_indices_ptr = (int *)0x10001000;
21 int *in_stride = (int *)0x10002000;
22 int *out_stride = (int *)0x10003000;
23
24 sparsereshape_p(in_indices_ptr, in_inshape, in_outshape, out_indices_ptr,
25 out_outshape, input_rank, output_rank, N, in_stride,
26 out_stride);
27
28 return 0;
29}